package de.hska.artikelverwaltung.db;

import static de.hska.artikelverwaltung.db.Artikel.FIND_VERFUEGBARE_ARTIKEL;
import static de.hska.util.EjbConstants.PERSISTENCE_CONTEXT_HSKA;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


@Stateless
@Local(ArtikelverwaltungDao.class)
public class ArtikelverwaltungDaoBean implements ArtikelverwaltungDao {
	public static final Log LOG = LogFactory.getLog(ArtikelverwaltungDaoBean.class);
	private static final boolean TRACE = LOG.isTraceEnabled();
	
	@PersistenceContext(name=PERSISTENCE_CONTEXT_HSKA)
	private EntityManager em;
	
	/**
	 * {@inheritDoc}
	 */
	@SuppressWarnings("unchecked")
	public List<Artikel> findVerfuegbareArtikel() {
		final Query query = em.createNamedQuery(FIND_VERFUEGBARE_ARTIKEL);
		List<Artikel> artikel = query.getResultList();
		if (artikel == null)
			artikel = new ArrayList<Artikel>();

		return artikel;
	}

	public List<Artikel> updateArtikel(List<Artikel> artikel) {
		if (artikel == null || artikel.isEmpty()) {
			return new ArrayList<Artikel>(0);
		}

		final List<Artikel> aktualisierteArtikel = new ArrayList<Artikel>(artikel.size());
		for (Artikel a : artikel) {
			if (TRACE) LOG.trace(a);
			
			final Long alteId = a.getId();
			// TODO OptimisticLockException bei konkurrierendem Update
			a = em.merge(a);
			
			// Wurde a konkurrierend geloescht und deshalb bei merge() eine neue ID erzeugt?
			if (a.getId().longValue() != alteId.longValue()) {
				em.remove(a);
			}
			else {
				aktualisierteArtikel.add(a);
			}
		}

		return aktualisierteArtikel;
		
	}
}
